#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include <time.h>
#include <sys/time.h>
#include "esp_wifi.h"
#include "esp_log.h"
#include "nvs_flash.h"


#define     TAG     "WIFI:"

static const char *TAG_STA = "wifi_sta";
bool conectFlag = 0;
// WiFi事件处理函数
void wifi_event_handler(void* arg, esp_event_base_t event_base,
                             int32_t event_id, void* event_data) {
    if (event_base == WIFI_EVENT) {
        switch (event_id) {
            case WIFI_EVENT_STA_START:
                ESP_LOGI(TAG, "WiFi station started");
                esp_wifi_connect();
                break;
            case WIFI_EVENT_STA_CONNECTED:
                ESP_LOGI(TAG, "Connected to AP");
                conectFlag = 1;
                break;
            case WIFI_EVENT_STA_DISCONNECTED:
                ESP_LOGI(TAG, "Disconnected from AP");
                // 自动重连
                esp_wifi_connect();
                break;
        }
    } else if (event_base == IP_EVENT) {
        if (event_id == IP_EVENT_STA_GOT_IP) {
            ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
            ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));
        }
    }
}

void wifi_init_sta(void)
{
    // 第1步：初始化NVS (Non-Volatile Storage) 非易失性存储
    // WiFi驱动需要用NVS来保存校准数据和配置信息
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        // 如果NVS分区有问题，就擦除并重新初始化
        ESP_ERROR_CHECK(nvs_flash_erase());
        ESP_ERROR_CHECK(nvs_flash_init());
    }

    // 第2步：初始化TCP/IP网络栈
    ESP_ERROR_CHECK(esp_netif_init());

    // 第3步：创建默认的事件循环（用于处理WiFi事件）
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    // 第4步：创建默认的WiFi STA网络接口
    esp_netif_create_default_wifi_sta();

    // 第5步：初始化WiFi驱动
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    // wifi_init_config_t cfg;
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    // 第6步：注册事件处理函数
    // 注册WiFi事件处理器（处理连接、断开等事件）
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        NULL));
    // 注册IP事件处理器（处理获取IP地址事件）
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                        IP_EVENT_STA_GOT_IP,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        NULL));

    // 第7步：设置WiFi工作模式为STA（Station，即客户端模式）
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));

    // 第8步：配置WiFi连接参数
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = "dhch",                        // 要连接的WiFi名称
            .password = "dhch123456",                // WiFi密码
            .threshold.authmode = WIFI_AUTH_WPA2_PSK, // 最低安全认证模式
        },
    };
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));

    // 第9步：启动WiFi
    // 启动后会自动触发WIFI_EVENT_STA_START事件，然后开始连接
    ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG_STA, "WiFi STA 初始化完成！配置连接到 SSID: %s", "dhch");
}